package com.aerfazhe.order.controller;

import com.alibaba.csp.sentinel.EntryType;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author：wk
 * @Create：2022/4/10/11:17
 * @Description：TODO
 * @Version：1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {

    private final static String RESOURCE_NAME = "findAll";

    /*@Resource(name = "restTemplate")
    private RestTemplate restTemplate;*/

    /**
     * @SentinelResource 改善接口中的资源定义和被流控降级后的处理方法
     *  value： 定义资源名称
     *  blockHandler：设置 流控、降级后的处理方法（默认该方法必须声明在同一个类中）
     *  blockHandlerClass: 如果将流控、降级处理方法设置在其他类中，则需要指定其他类，且流控、降级方法需要加上static静态
     *  fallback: 处理接口异常时指定的方法
     * @return
     */
    @GetMapping("/getMapper")
//    @SentinelResource(value = "getMapper",entryType = EntryType.IN,blockHandler = "degrade",fallback = "error")
    public String getMapper() {
//        throw new RuntimeException("异常");
        return "Hello World";
    }

    /**
     * 注意：
     * 1、一定要public
     * 2、返回值要和源方法保持一致,包含源方法的参数且顺序要保持一致
     * 3、可以在参数最后添加 BlockException区分是什么规则的处理方法
     * 降级方法
     * @return
     */
    public String degrade(BlockException e) {
        return "被降级喽！";
    }

    /**
     * 注意：
     * 1、一定要public
     * 2、返回值要和源方法保持一致,包含源方法的参数且顺序要保持一致
     * 3、可以在参数最后添加 BlockException区分是什么规则的处理方法
     * 降级方法
     * @return
     */
    public String error() {
        return "服务出现错误喽！";
    }


    /**
     * 热点参数规则
     * @param id
     * @return
     */
    @GetMapping("/hot-spot/{id}")
    @SentinelResource(value = "hotSpot",blockHandler = "hotSpotBlockException")
    public String hotSpot(@PathVariable(value = "id") Integer id) {

        return "热点参数规则正常访问！";
    }


    public String hotSpotBlockException(@PathVariable(value = "id") Integer id,BlockException e) {
        return "热点参数异常处理！";
    }


}
